GO
1. 信号知识
1.1. 信号介绍
运行Shell脚本程序时,如果按下快捷键Ctrl+C
或Ctrl+x(x为其它字符)
,程序就会立刻终止运行。
在有些情况下,我们并不希望Shell脚本在运行时被信号中断,此时就可以使用屏蔽信号手段,让程序忽略用户输入的信号指令,从而继续运行Shell脚本程序。
简单地说,Linux的信号是由一个整数构成的异步消息,它可以由某个进程发给其它的进程,也可以在用户按下特定键发生某种异常事件时,由系统发给某个进程。
1.2. 信号列表
在Linux下和信号相关的常见命令为kill
及trap
,这篇学习笔记重点记录了如何使用trap
命令,以及如何利用trap
控制的跳板机脚本来使用信号。
执行kill -l
或trap -l
命令,可以列出系统支持的各种信号,多达64个,如下:
下面将对企业实战中Linux系统的重要信号进行说明,见下表(在使用信号名时需要省略SIG前缀):
信号 | 说明 |
---|---|
HUP(1) | 挂起,通常因终端掉线或用户退出而引发 |
INT(2) | 中断,通常因按下Ctrl+C组合键而引发 |
QUIT(3) | 退出,通常因按下Ctrl+\组合键而引发 |
ABRT(6) | 中止,通常因某些严重的执行错误而引发 |
ALRM(14) | 报警,通常用来处理超时 |
TERM(15) | 终止,通常在系统关机时发送 |
TSTP(20) | 停止进程的运行,但该信号可以被处理和忽略,通常因按下Ctrl+z组合键而引发 |
通常需要忽略的信号包括HUP、INT、QUIT、TSTP、TERM等,对应的信号编号分别为1、2、3、20、15。Shell脚本中既可以用数字来代表信号,也可以使用信号的名字来代表信号。
2. 使用trap控制信号
trap命令用于指定在接收到信号后将要采取的行动。trap命令的一种常见用途是在脚本程序被中断时完成清理工作,或者屏蔽用户非法使用的某些信号。在使用信号名时需要省略SIG前缀。可以在命令提示符下输入命令trap -l
来查看信号的编号及其关联的名称。
trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名。
trap命令的使用语法如下:trap command signal
- signal是指接收到的信号
- command是指接收到该信号应采取的行动
- 也就是
trap '命令; 命令' 信号编号
或trap '命令; 命令' 信号名
范例1:测试trap命令捕获Ctrl+C信号
用stty -a
可以列出中断信号与键盘的对应信息,如下:
范例2:测试按下Ctrl+C组合键而引发的INT(2)信号:
范例3:同时处理多个信号
- 执行任何一个对应信号的事件时,都会执行前面对用的动作,因为动作为空吗,所以执行后没有任何反应。
trap "" 1 2 3 20 15
执行这些数字信号,什么都不做trap ":" 1 2 3 20 15
执行这些数字信号,恢复对应功能trap "" HUP INT QUIT TSTP TERM
执行这些名称信号,什么都不做trap ":" HUP INT QUIT TSTP TERM
执行这些名称信号,恢复对应功能- 屏蔽1-64的所有数字信号:1trap "" `echo {1..64}`
3. Linux信号及trap命令的生产应用案例
范例:开发脚本实现触发信号后清理文件功能
脚本如下;
123456789trap "find /tmp -type f -name 'theshu_*' | xargs rm -f && exit" INT#<==捕获Ctrl+C键后即执行find删除命令while truedotouch /tmp/theshu_$(date +%F-%H-%M-%S) #<==在/tmp下创建文件sleep 3 #<==休息3秒ls -l /tmp/theshu* #<==查看文件创建的情况done执行结果:
123456789[root@theshu ~]# sh trap.sh-rw-r--r-- 1 root root 0 Mar 2 10:45 /tmp/theshu_2018-03-02-10-45-52-rw-r--r-- 1 root root 0 Mar 2 10:45 /tmp/theshu_2018-03-02-10-45-52-rw-r--r-- 1 root root 0 Mar 2 10:45 /tmp/theshu_2018-03-02-10-45-55-rw-r--r-- 1 root root 0 Mar 2 10:45 /tmp/theshu_2018-03-02-10-45-52-rw-r--r-- 1 root root 0 Mar 2 10:45 /tmp/theshu_2018-03-02-10-45-55-rw-r--r-- 1 root root 0 Mar 2 10:45 /tmp/theshu_2018-03-02-10-45-58^C[root@theshu ~]# ls /tmp/theshu*ls: cannot access /tmp/theshu*: No such file or directory
OK